package com.yuma.delegate;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Sing {
    void sing(String song);
    void dance();
}

class Star implements Sing{
    @Override
    public void sing(String song) {
        System.out.println("某明星正在演唱" + song);
    }

    @Override
    public void dance() {
        System.out.println("某明星正在跳舞");
    }
}

public class ProxyDemo {
    public static void main(String[] args) {
        // 动态代理
        Star zhm =  new Star();
        // 被代理类有什么方法，代理就有什么方法  ,代理类要和被代理类是相同的类加载器
        Sing singer = (Sing) Proxy.newProxyInstance(
                Sing.class.getClassLoader(),  // 1.设置动态代理类的类加载器  AppClassLoader
                zhm.getClass().getInterfaces(),  // 2. 代理要和被代理实现相同的父接口
                new InvocationHandler() {    // 3.调用代理类的代理方法
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("报幕...");
                        method.invoke(zhm, args);
                        System.out.println("谢幕");
                        return null;
                    }
                }
        );

        singer.sing("站在高岗上");
        singer.dance();
    }
}
